package com.aceleeyy.apb.base;

import io.swagger.annotations.ApiModelProperty;
import org.springframework.util.CollectionUtils;

import java.io.Serializable;
import java.util.Collections;
import java.util.List;
import java.util.Objects;

/**
 * 分页结果
 */
public class Page<T> implements Serializable {

    /**
     * 内容
     */
    @ApiModelProperty("结果集")
    private List<T> list;

    /**
     * 总记录数
     */
    @ApiModelProperty("记录总数")
    private long total;

    /**
     * 初始化一个新创建的Page对象Page
     */
    public Page() {
        this.total = 0L;
    }

    /**
     * @param list 内容
     * @param total   总记录数
     */
    public Page(List<T> list, long total) {
        this.list = list;
        this.total = total;
    }

    /**
     * @param list
     * @param total
     * @param <T>
     * @return
     */
    public static <T> Page<T> newPager(List<T> list, long total) {
        return new Page<>(list, total);
    }

    /**
     * 快速构造空的分页对象实体
     *
     * @param <T> 记录类型泛型
     * @return 分页对象
     */
    public final static <T> Page<T> empty() {
        return new Page<>(Collections.emptyList(), 0);
    }

    /**
     * 构造分页对象
     *
     * @param <T> 记录类型泛型
     * @return 分页对象
     */
    public static <T> Page<T> with(List<T> list, long total) {
        return new Page<>(list, total);
    }

    public static <T> boolean isEmpty(Page<T> p) {
        return Objects.isNull(p) || CollectionUtils.isEmpty(p.getList());
    }

    public static <T> boolean nonEmpty(Page<T> p) {
        return !isEmpty(p);
    }

    /**
     * 获取内容
     *
     * @return 内容
     */
    public List<T> getList() {
        return list;
    }

    /**
     * 获取总记录数
     *
     * @return 总记录数
     */
    public long getTotal() {
        return total;
    }

    public Page<T> setList(List<T> list) {
        this.list = list;
        return this;
    }

    public Page<T> setTotal(long total) {
        this.total = total;
        return this;
    }

    @Override
    public String toString() {
        return "Page{" +
                "list=" + list +
                ", total=" + total +
                '}';
    }
}
